package ru.chezclif.lern.conread;

import java.util.List;
import ru.chezclif.lern.conread.enumerations.EnumPseudoProtocols;
import ru.chezclif.lern.conread.readers.PropertyReader;
import ru.chezclif.lern.conread.readers.PropertyReaderReadOnly;

/**
 * Основной класс для чтения, сохранения и редактирования настроек. Являеться классом-оберткой к незащищенному DataBuffer.
 * 
 * @author Vit
 */
public class PropertyReaderOriginal implements PropertyReader, PropertyReaderReadOnly {
	/**
	 * Экземпляр хранилища данных
	 */
	private final DataBuffer propertiesData = new DataBuffer();

	@Override
	/**
	 * Чтение файла и сохранение настроек в хранилище даннных
	 * 
	 * @param pseudoProtocolString строка, содержащая псевдопротокол и путь до оперируемого файла
	 */
	public void readFile(String pseudoProtocolString) {
		Preconditions.notBlank(pseudoProtocolString);
		Preconditions.notNull(pseudoProtocolString);
		PseudoProtocolParser stringParser = new PseudoProtocolParser();
		stringParser.parsePseudoProtocol(pseudoProtocolString);
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.INI)) {
			IniParser iniParser = new IniParser();
			iniParser.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.PROPERTIES)) {
			PropertyParser propertyparser = new PropertyParser();
			propertyparser.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.XML)) {
			XmlParser xmlParser = new XmlParser();
			xmlParser.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.FILE)) {
			FileParser fileParser = new FileParser();
			fileParser.parseFile(stringParser.getPath(), propertiesData);
		}
	}

	/**
	 * Сохранение в файл определенного формата настроек из хранилища данных
	 * 
	 * @param psevdoProtocolString строка, содержащая псевдопротокол и путь до оперируемого файла
	 */
	@Override
	public void saveFile(String psevdoProtokolString) {
		Preconditions.notBlank(psevdoProtokolString);
		Preconditions.notNull(psevdoProtokolString);
		PseudoProtocolParser stringParser = new PseudoProtocolParser();
		stringParser.parsePseudoProtocol(psevdoProtokolString);
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.INI)) {
			IniSaver iniSaver = new IniSaver();
			iniSaver.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.PROPERTIES)) {
			PropertySaver propertySaver= new PropertySaver();
			propertySaver.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType().equals(EnumPseudoProtocols.XML)) {
			XmlSaver xmlSaver = new XmlSaver();
			xmlSaver.parseFile(stringParser.getPath(), propertiesData);
		}
	}

	/**
	 * Получить значение настройки по ключу
	 * 
	 * @param key ключ
	 */
	@Override
	public String getSetting(String key) {
		Preconditions.notBlank(key);
		Preconditions.notNull(key);
		return propertiesData.getSetting(key);
	}

	/**
	 * Задать ключу значение
	 * 
	 * @param key ключ
	 * @param value значение
	 */
	@Override
	public void setSetting(String key, String value) {
		Preconditions.notBlank(key, value);
		Preconditions.notNull(key, value);
		propertiesData.setSetting(key, value);
	}

	/**
	 * Удалить одну настройку (ключ со значением)
	 * 
	 * @param key ключ
	 * @param value значение
	 */
	@Override
	public void removeSetting(String key, String value) {
		Preconditions.notBlank(key, value);
		Preconditions.notNull(key, value);
		propertiesData.removeSetting(key, value);
	}

	/**
	 * Получить заглавный комментарий
	 */
	@Override
	public String getHeaderComment() {
		return propertiesData.getHeaderComment();
	}

	/**
	 * Задать заглавный комментарий
	 * 
	 * @param comment Заглавный комментарий
	 */
	@Override
	public void setHeaderComment(String comment) {
		Preconditions.notNull(comment);
		propertiesData.setHeaderComment(comment);
	}

	/**
	 * Получить конечный комментарий
	 */
	@Override
	public String getFooterComment() {
		return propertiesData.getFooterComment();
	}

	/**
	 * Задать конечный комментарий
	 * 
	 * @param comment Конечный комментарий
	 */
	@Override
	public void setFooterComment(String comment) {
		Preconditions.notNull(comment);
		propertiesData.setFooterComment(comment);
	}

	/**
	 * Получить коллекцию всех ключей из хранилища настроек
	 * 
	 * @param localBufferForKeys коллекция для заполнения ее ключами
	 */
	@Override
	public List<String> getKeys(List<String> localBufferForKeys) {
		Preconditions.notNull(localBufferForKeys);
		localBufferForKeys = propertiesData.getKeys(localBufferForKeys);
		return localBufferForKeys;
	}

	/**
	 * Получить коллекцию ключей находящихся в определенной субсекции
	 * 
	 * @param sectionName название секции до точки
	 * @param localBufferForSubsectionKeys коллекция для заполнения ее ключами
	 */
	@Override
	public List<String> getSubsectionKeys(String sectionName, List<String> localBufferForSubsectionKeys) {
		Preconditions.notNull(localBufferForSubsectionKeys);
		Preconditions.notBlank(sectionName);
		Preconditions.notNull(sectionName);
		localBufferForSubsectionKeys = propertiesData.getSubsectionKeys(sectionName, localBufferForSubsectionKeys);
		return localBufferForSubsectionKeys;
	}

	/**
	 * Получить коллекцию значений находящихся в определенной субсекции
	 * 
	 * @param sectionName название секции до точки
	 * @param localBufferForSubsectionvalues коллекция для заполнения ее ключами из субсекции
	 */
	@Override
	public List<String> getSubsectionValues(String sectionName, List<String> localBufferForSubsectionvalues) {
		Preconditions.notNull(localBufferForSubsectionvalues);
		Preconditions.notBlank(sectionName);
		Preconditions.notNull(sectionName);
		localBufferForSubsectionvalues = propertiesData.getSubsectionValues(sectionName, localBufferForSubsectionvalues);
		return localBufferForSubsectionvalues;
	}
}
